# 题目: 678. 有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号
(
必须有相应的右括号)
。 - 任何右括号
)
必须有相应的左括号(
。 - 左括号
(
必须在对应的右括号之前)
。 *
可以被视为单个右括号)
,或单个左括号(
,或一个空字符串。- 一个空字符串也被视为有效字符串。
# 题解: 贪心
先假设如果没有*
的时候,我们只需要遍历一次字符串,初始 flag 为 0
- 如果遍历到
(
,则flag ++ - 如果遍历到
)
,则flag --
遍历完之后,flag也为0则说明匹配。注意:在遍历的过程中,flag不能为负数。
如今增添了 *
,当字符为*
,会出现三种情况:
- flag++
- flag--
- flag不变
为了应付这三种情况,我们使用两个变量来记录字符的变化,maxFlag,minFlag
- 如果遍历到
(
,则maxFlag++,minFlag ++ - 如果遍历到
)
,则maxFlag--,minFlag-- 当遇到*
时:
- maxFlag++
- minFlag--
# 代码
/**
* @param {string} s
* @return {boolean}
*/
var checkValidString = function(s) {
let maxFlag =0,minFlag = 0
for(let i of s){
if(i === '('){
maxFlag++
minFlag++
}
if(i === ')'){
maxFlag--
minFlag = minFlag-1>0?minFlag-1:0
if(maxFlag<0) return false
}
if(i === '*'){
minFlag = minFlag-1>0?minFlag-1:0
maxFlag++
}
}
return minFlag === 0
};